importPackage(Packages.de.elo.ix.client);
//@include lib_Class.js
//@include lib_sol.common.Config.js
//@include lib_sol.common.SordUtils.js
//@include lib_sol.common.ObjectFormatter.js
//@include lib_sol.common.ix.ServiceBase.js
//@include lib_sol.common.ix.DataCollectorBase.js
var logger = sol.create("sol.Logger", { scope: "sol.common.ix.services.ParentDataCollector" });
/**
* Collects all parent information from the hierarchy.
*
* The hierarchy will be returned as a flat structure.
*
* The result hierarchy contains the following properties:
*
* - sord: The selected element itself
* - parent: The direct parent element
* - SOL_TYPE: For each fount SOL_TYPE one property (see {@link #mode}), could contain duplicates to 'parent' and 'sord'
*
* # Example
*
* var result = sol.common.IxUtils.execute("RF_sol_common_service_ParentDataCollector", {
* objId: "5690",
* formatter: "sol.common.ObjectFormatter.StatisticSord"
* });
*
* # Result
*
* {
* version: '1.00.000',
* formatter: 'sol.common.ObjectFormatter.StatisticSord',
* sord: {
* id: "5690",
* name: 'Annual report',
* O_INVOICE_DATE: '20160101'
* },
* parent: {
* id: "5669",
* name: '12 Public relations',
* O_INVOICE_DATE: '20151202'
* },
* FILE: {
* id: "5669",
* name: '12 Public relations',
* O_INVOICE_DATE: '20151202'
* },
* ...
* }
*
*
* @author PZ, ELO Digital Office GmbH
* @version 1.1
*
* @eloix
* @requires sol.common.Config
* @requires sol.common.JsonUtils
* @requires sol.common.SordUtils
* @requires sol.common.ObjectFormatter
* @requires sol.common.ix.RfUtils
* @requires sol.common.ix.ServiceBase
* @requires sol.common.ix.DataCollectorBase
*
*/
sol.define("sol.common.ix.services.ParentDataCollector", {
extend: "sol.common.ix.DataCollectorBase",
requiredConfig: ["objId"],
collectorVersion: "1.01.000",
MODES: {
FIRST_WINS: "FIRST_WINS",
LAST_WINS: "LAST_WINS",
ALL: "ALL"
},
DEFAULT_VALUES: {
hierarchicalIdentifier: "SOL_TYPE",
mode: "FIRST_WINS",
formatter: "sol.common.ObjectFormatter.TemplateSord",
sordKeys: ["id", "guid", "maskName", "name", "desc", "IDateIso", "XDateIso", "ownerName"],
allMapFields: false
},
/**
* @cfg {String} objId (required)
* id of the parent element (guid, objId or archivepath)
*/
/**
* @cfg {String} [hierarchicalIdentifier="SOL_TYPE"]
* The value from this field will be used to collect the hierarchy
*/
/**
* @cfg {String} [mode="FIRST_WINS"]
* The mode defines, which object from the hierarchy will be send with the result.
*
* - "FIRST_WINS": the first hit (upwards) in the hierarchy for each type wins
* - "LAST_WINS": the last hit (upwards) in the hierarchy for each type wins
* - "ALL": collects an array of the specific type (not implemented yet)
*
*/
/**
* @cfg {String} [formatter="sol.common.ObjectFormatter.StatisticSord"]
* Sord object formatter implementation.
*
* e.g. `sol.common.ObjectFormatter.StatisticSord` or `sol.common.ObjectFormatter.TemplateSord`
*/
/**
* @cfg {String[]} sordKeys
* The data objects will contain this keys from the sord.
* By default the following keys will be returned: ['id', 'guid', 'maskName', 'name', 'desc', 'IDateIso', 'XDateIso', 'ownerName']
*/
/**
* @cfg {Boolean} allMapFields
* The data objects will contain all map fields.
*/
initialize: function (config) {
var me = this;
me.$super("sol.common.ix.DataCollectorBase", "initialize", [config]);
me.hierarchicalIdentifier = config.hierarchicalIdentifier || me.DEFAULT_VALUES.hierarchicalIdentifier;
me.mode = config.mode || me.DEFAULT_VALUES.mode;
me.formatter = config.formatter || me.DEFAULT_VALUES.formatter;
me.sordKeys = config.sordKeys || me.DEFAULT_VALUES.sordKeys;
me.allMapFields = config.allMapFields || me.DEFAULT_VALUES.allMapFields;
},
/**
* Starts the collection of the desired data
* @return {String}
*/
execute: function () {
var me = this,
data = {},
sord, parentSord;
data.version = me.collectorVersion;
data.formatter = me.formatter;
try {
sord = ixConnect.ix().checkoutSord(me.objId, SordC.mbAllIndex, LockC.NO);
parentSord = ixConnect.ix().checkoutSord(sord.parentId, SordC.mbAllIndex, LockC.NO);
data.sord = me.createTemplateSord(sord);
data.parent = me.createTemplateSord(parentSord);
me.collectHierarchy(sord, data);
} catch (ex) {
me.logger.warn("Error collecting data, continue with data collected so far", ex);
}
return sol.common.JsonUtils.stringifyAll(data);
},
/**
* @private
* @param {de.elo.ix.client.Sord} sord
* @param {Object} dataObj
*/
collectHierarchy: function (sord, dataObj) {
var me = this,
type;
if (sord.id > 1) {
type = sol.common.SordUtils.getObjKeyValue(sord, me.hierarchicalIdentifier);
if (type) {
switch (me.mode) {
case me.MODES.FIRST_WINS:
if (!dataObj[type]) {
dataObj[type] = me.createTemplateSord(sord);
}
break;
case me.MODES.LAST_WINS:
dataObj[type] = me.createTemplateSord(sord);
break;
case me.MODES.ALL:
throw "mode '" + me.MODES.ALL + "' is not implemented yet";
default:
throw "mode" + me.mode + "is not defined";
}
}
me.collectHierarchy(ixConnect.ix().checkoutSord(sord.parentId, SordC.mbAllIndex, LockC.NO), dataObj);
}
},
/**
* @private
* @param {de.elo.ix.client.Sord} sord
* @return {Object}
*/
createTemplateSord: function (sord) {
var me = this;
return sol.common.ObjectFormatter.format({
sord: {
formatter: me.formatter,
data: sord,
config: {
allMapFields: me.allMapFields,
sordKeys: me.sordKeys
}
}
}).sord;
}
});
/**
* @member sol.common.ix.services.ParentDataCollector
* @method RF_sol_common_service_ParentDataCollector
* @static
* @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
*/
function RF_sol_common_service_ParentDataCollector(ec, configAny) {
logger.enter("RF_sol_common_service_ParentDataCollector", configAny);
var rfUtils = sol.common.ix.RfUtils,
config = rfUtils.parseAndCheckParams(ec, arguments.callee.name, configAny, "objId"),
jsonDataCollector, result;
jsonDataCollector = sol.create("sol.common.ix.services.ParentDataCollector", config);
result = jsonDataCollector.execute();
logger.exit("RF_sol_common_service_ParentDataCollector", result);
return result;
}